package dbmanager

import (
	"gitee.com/night-tc/gobige/entity"
	"gitee.com/night-tc/gobige/global"
	"gitee.com/night-tc/gobige/msgdef/protomsg"
)

/*
系统模块需要实现的接口

*/

// IServiceModel 定义了系统模块需要实现的接口，用于管理模块的数据加载、同步、初始化等操作。
type IServiceModel interface {
	// GetServiceName 返回系统模块的名称。
	GetServiceName() string
	// GetTableNames 返回系统模块需要的表名列表。
	GetTableNames() []string
	// GetLoadServerType 返回从哪个服务器类型加载数据，ServerTypeDefault 表示同步从DB加载，其他结果都是延迟从其他服加载。
	GetLoadServerType() global.ServerTypeEnum
	// GetDataArgs 返回脏数据收集器。
	GetDataArgs() *DataArgs
	// IsSingleTable 判断是否为单一表加载，并返回是否有Limit，如果没有限制，Limit为-1。
	IsSingleTable() (result bool, limit int32)

	// LoadDB 从DB获取数据，或从别的服获取数据后的加载方法。
	LoadDB(lis map[string][]IDataBaseModel)
	// LoadData 从Redis加载数据的方法。
	LoadData(lis map[string][]IDataBaseModel)
	// GetIsLoaded 返回系统模块是否已经加载过数据。
	GetIsLoaded() bool
	// OtherData 处理其他服务器同步过来的差量数据。
	OtherData(msg *protomsg.DBUpUserDatasReq)
	// InitLoaded 在LoadDB和LoadData成功后调用，用于填充数据后的初始化。
	InitLoaded()

	// SyncData 同步数据到客户端、Redis或DBServer。
	SyncData()
	// AllDataSyncClient 将全量数据同步到客户端。
	AllDataSyncClient()

	// GetRedisTableDataAllDoMD 从Redis获取指定表的所有数据。
	GetRedisTableDataAllDoMD(tnames []string) (result map[string][]IDataBaseModel, err error)
}

// IServicePlayer 定义了服务器上的PlayerNtt对象需要实现的接口，继承自IPlayer、IEntityReal和IServiceModel。
type IServicePlayer interface {
	IPlayer
	entity.IEntityReal
	IServiceModel
	// CallDelay 支持延迟回调。
	CallDelay(f func())
	// OnLoadedAll 在所有系统都加载完成后调用。
	OnLoadedAll()
	// RegMsgProc 注册消息处理函数。
	RegMsgProc(interface{})
}
